#ifndef PLATEAU_H
#define PLATEAU_H

#include "Case.h"
#include "Image.h"

class Plateau
{
private :
	vector<Point*>	pts;
	vector<Case*>	data;
	Image			im;

public:
    Plateau();
	~Plateau();
	
	void setCaseType ( int _i, QString _t );								/* Modificateur du type de la case numéro _i du plateau */
	void setCasePts ( int _i, int _nb );									/* Renseigne le champ nbPions de la case numero _i du plateau */
	
	Point* getPoint ( int _i );												/* Renvoie le _i eme point du plateau */
	int getNbPts();															/* Renvoie le nombre de points que contient le plateau */
	
	int getCaseNbPions ( int _i );											/* Renvoie le nombre de pions présents sur la case _i du plateau */
		
	void addCase();															/* Ajoute une case vide au plateau */
	void addCase( Case* _c );												/* Ajoute une copie de la case  _c au plateau */
	void addPoint( Point* _p );												/* Ajoute un point dans le plateau */
	
	void deletePoint( Point* _p );											/* Supprime un point du plateau */
	void replacePoint( Point* _p1, Point* _p2 );							/* Remplace le point _p1 par _p2 si _p1 fait partie du plateau */
	
	Point* newPoint( Point* _p);											/* Ajoute le point _p au plateau s'il n'est pas proche d'un point du plateau et le renvoie, renvoie le point dont il est proche sinon */
	Point* pointClic(Point* _p);											/* Renvoie le point _p s'il est contenu dans le plateau, NULL sinon */
	Point* pointClic(Point *_p1, Point* _p2 );								/* Renvoie le point _p1 s'il est contenu dans le plateau ET différent de _p2, NULL sinon */
			
	void initNeigbourhood();												/* Initialise le voisinnage de toutes les cases du plateau */
	bool getBord ( int _i );												/* Renvoie true si la case _i du plateau fait partie du bord, false sinon */
	
	int contains (Point* _p);												/* Renvoie le numéro de la case contenant le point _p, -1 si aucune case ne le contient */
	int contains ( int _x, int _y );										/* Renvoie le numéro de la case contenant le point (_x,_y), -1 si aucune case ne le contient */
	
	void display();															/* Affiche l'image du plateau */
	void displayCases();													/* Affiche le contours de toutes les cases du plateau */
	void displayCase ( int _i, float _r, float _g, float _b, float _a );	/* Affiche en plein en couleur et ransparence la case numéro _i du plateau */
	void displayCaseType( int _i );											/* Affiche le type de la case numéro _i du plateau à la position de son barycentre */
	void displayCaseNbPions ( int _i );										/* Affiche le nombre de pions de la case _i du plateau une ligne sous le barycentre de celle ci */
	
	/* Version de test il faudra la modifier */
	void displayCasePions ( int _i, Image _im  );							/* Affiche les pions de la case _i en image sur la case */
	
	void displayNeighbourhood(int _i, float _r, float _g, float _b);		/* Affiche le voisinnage de la case _i du plateau */
	void displayPoints();													/* Affiche tous les points du plateau */
	void displayAll();														/* Affiche les points du plateau ET les contours des cases */
	
	void resize( int _oldW, int _oldH, int _w, int _h );					/* Modifie les coordonnées des points du plateau pour qu'ils s'adaptent à la taille de la fenetre (_w,_h) */
};

#endif // PLATEAU_H
